/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package inteligenciaartificial;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;

/**
 *
 * @author Leo
 */
public class PDFCorrida {
    
    
    private static Paragraph textoPDF = new Paragraph();
    private static Paragraph encabezadoPDF = new Paragraph();
    private static Paragraph fechaPDF = new Paragraph();
//    private static Document documentoPDF = new Document(PageSize.LETTER, 80, 80,50, 50);
    private static File rutaDestino=null;
    private static int indiceGeneracion=0;
    private static BarraProgreso barraProgreso = new BarraProgreso("Guardando Corrida. Por favor espere.");
    private static JFrame ventanaPadre;
    private static Thread hiloProgreso;  
    
    public static void crearPDF (int generaciones, JFrame ventana){
        ventanaPadre=ventana;
        //abre ventana de dialogo "guardar"
        elegirDestino();
        //si destino es diferente de null
        if(PDFCorrida.rutaDestino!=null){
            
            try{
                indiceGeneracion=generaciones; 

                 barraProgreso.setearBarra(0, indiceGeneracion);

                 barraProgreso.setResizable(false);
                 
                 barraProgreso.setLocation(ventanaPadre.getLocation().x +150, ventanaPadre.getLocation().y +150);
                 ventanaPadre.setEnabled(false);
                 barraProgreso.setVisible(true);
                         
                 textoPDF.setAlignment(Paragraph.ALIGN_LEFT);
                 textoPDF.getFont().setFamily("arial");
                 textoPDF.getFont().setSize(10);
                 
                 encabezadoPDF.setAlignment(Paragraph.ALIGN_LEFT);
                 encabezadoPDF.getFont().setFamily("times new roman");
                 encabezadoPDF.getFont().setSize(10);
                 
                 fechaPDF.setAlignment(Paragraph.ALIGN_RIGHT);
                 fechaPDF.getFont().setFamily("arial");
                 fechaPDF.getFont().setSize(10);
                 
                 if( hiloProgreso == null ) {
                    hiloProgreso = new ThreadProgreso();
                    hiloProgreso.start();
                }

            } catch (Exception e){}
           
        }    
    
    }
    
    private static void elegirDestino(){
       FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo PDF","pdf","PDF");
       FileSystemView fsv = FileSystemView.getFileSystemView();
       JFileChooser fileChooser = new JFileChooser(fsv.getRoots()[0]);       
       fileChooser.setFileFilter(filter);
       int result = fileChooser.showSaveDialog(null);
       if ( result == JFileChooser.APPROVE_OPTION ){   
           PDFCorrida.rutaDestino = fileChooser.getSelectedFile().getAbsoluteFile();
        }
    }
    
    private static class ThreadProgreso extends Thread{
        @Override
        public void run(){
            Document documentoPDF = new Document(PageSize.LETTER, 80, 80,50, 50);
            try {
                try {
                    PdfWriter.getInstance(documentoPDF, new FileOutputStream(PDFCorrida.rutaDestino + ".pdf"));
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(PDFCorrida.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (DocumentException ex) {
                Logger.getLogger(PDFCorrida.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            DecimalFormat formateador = new DecimalFormat("00");
            Calendar calendario = Calendar.getInstance();
            String dia = formateador.format(calendario.get(Calendar.DAY_OF_MONTH));
            String mes = formateador.format(calendario.get(Calendar.MONTH)+1);
            String año = formateador.format(calendario.get(Calendar.YEAR));
            String hora = formateador.format(calendario.get(Calendar.HOUR_OF_DAY));
            String minuto = formateador.format(calendario.get(Calendar.MINUTE));
            String segundo = formateador.format(calendario.get(Calendar.SECOND));
            
            
            
            documentoPDF.open();
            
                 fechaPDF.add(dia+"/"+mes+"/"+año+"      "+hora+":"+minuto+":"+segundo);
                 fechaPDF.add(Chunk.NEWLINE);
                 
                 Chunk tituloEncabezado = new Chunk("Parámetros configurados para la corrida", FontFactory.getFont("arial", 10, Font.UNDERLINE | Font.BOLD));
                 
                 encabezadoPDF.add(tituloEncabezado);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add("Cantidad máxima de Generaciones: " + Settings.cantidadGeneraciones);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add("Individuos por Generación: " + Settings.totalPoblacion);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add("Porcentaje utilidad objetivo: " + (int) (Settings.porcentajeDeAceptacion *100)+"%" );
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 
                 Chunk operadores = new Chunk("Operadores utilizados para generar las poblaciones", FontFactory.getFont("arial", 10, Font.UNDERLINE | Font.BOLD));
                 
                 encabezadoPDF.add(operadores);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 
                 for (int i=0; i<Settings.algoritmosGeneticos.size(); i++){
                    encabezadoPDF.add(Settings.algoritmosGeneticos.entrySet().toArray()[i].toString() + "%"); 
                    encabezadoPDF.add(Chunk.NEWLINE);
                 }
                 encabezadoPDF.add(Chunk.NEWLINE);
                                  
                 Chunk materiales = new Chunk("Cantidad de materiales ingresados", FontFactory.getFont("arial", 10, Font.UNDERLINE | Font.BOLD));
                 
                 encabezadoPDF.add(materiales);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 for (int i=0;i<IndividuoManager.getCatidadesDeMateriales().length;i++){
                    encabezadoPDF.add("Material " + (i+1) + ": " + IndividuoManager.getCatidadesDeMateriales()[i]);
                    encabezadoPDF.add(Chunk.NEWLINE);
                 }
                 encabezadoPDF.add(Chunk.NEWLINE);
                 //Agregar utilidades de los productos
                 Chunk utilidades = new Chunk("Utilidad de cada tipo de producto", (FontFactory.getFont("arial", 10, Font.UNDERLINE | Font.BOLD)));
                 
                 
                 encabezadoPDF.add(utilidades);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(Chunk.NEWLINE);
                 for (int i=0;i<Settings.utilidades.length;i++){
                    encabezadoPDF.add("Producto " + (i+1) + ": " + Settings.utilidades[i]);
                    encabezadoPDF.add(Chunk.NEWLINE);
                 }
                 
                 
                 
                 encabezadoPDF.add(Chunk.NEWLINE);
                 encabezadoPDF.add(new Chunk(new LineSeparator()));
                 encabezadoPDF.add(Chunk.NEXTPAGE);
                 
            try {
                documentoPDF.add(fechaPDF);
                documentoPDF.add(encabezadoPDF);
            } catch (DocumentException ex) {
                Logger.getLogger(PDFCorrida.class.getName()).log(Level.SEVERE, null, ex);
            }
                 
                    
            for (int i=0;i<indiceGeneracion;i++){
                    barraProgreso.progresarBarra(i);
                    
                    textoPDF.add(new Chunk("Generación "+i,FontFactory.getFont("arial",10,Font.BOLD)));
                    textoPDF.add(Chunk.NEWLINE);
                    textoPDF.add(Chunk.NEWLINE);
                    for(int j=0;j<Settings.totalPoblacion;j++){
                                textoPDF.add(GeneracionManager.getGeneracionNumero(i).getIndividuos()[j].toString() +" ---> utilidad:"+AptitudUtilidad.calcularAptitud(GeneracionManager.getGeneracionNumero(i).getIndividuos()[j]));
                                textoPDF.add(Chunk.NEWLINE);
                                textoPDF.add(Chunk.NEWLINE);
                            }
                    textoPDF.add(Chunk.NEWLINE);
                    textoPDF.add(new Chunk(new LineSeparator()));
                    textoPDF.add(Chunk.NEWLINE);
                try {
                    
                    documentoPDF.add(textoPDF);
                } catch (DocumentException ex) {
                    Logger.getLogger(PDFCorrida.class.getName()).log(Level.SEVERE, null, ex);
                }
                    textoPDF.clear();
               
            }
            documentoPDF.close();
            barraProgreso.progresarBarra(indiceGeneracion);
             
            JOptionPane.showMessageDialog(barraProgreso, "Guardado");
            barraProgreso.dispose();
            hiloProgreso =null; 
            ventanaPadre.setEnabled(true);
        }
        
        }
    
  
    
}
